/**
 * [209] 长度最小的子数组
 * tips:
 * 1 <= target <= 109
 * 1 <= nums.length <= 105
 * 1 <= nums[i] <= 105
 *
 * @format
 * @lc app=leetcode.cn id=209 lang=javascript
 */

// @lc code=start
/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
// 滑动窗口
var minSubArrayLen = function (target, nums) {
    const N = nums.length
    // 左右指针记录窗口区间 [l,r]，窗口元素总合 sum
    let [l, r, sum] = [0, 0, nums[0]]
    // 初始化窗口：从左到右拉窗
    while (sum < target && r < N) sum += nums[++r]
    // 数组总和仍小于 target 即不存在符合条件的子数组 return 0
    // 最终 r == N 总和 sum = sum‘ + nums[N] = NaN
    if (!sum) return 0
    // 此时 [0,r] 区间和刚刚好满足 sum >= target
    while (r < N) {
        // 尝试向右收缩左边界
        while (sum >= target && sum - nums[l] >= target) sum -= nums[l++]
        // 区间右滑
        sum = sum - nums[l++] + nums[++r]
        // console.log(l, r, sum)
    }
    return r - l + 1
}
// debugger
// const target = 11
// const nums = [1, 2, 3, 4, 5]
// const len = minSubArrayLen(target, nums)
// console.log(len)
// @lc code=end
